/**
 * 文档 https://www.runoob.com/html/html5-web-sql.html
 * 5+ API路径(RelativeURL) - 以"_"开头的相对路径，如"_doc/a.db"（推荐使用"_doc/x.db"目录保存）
 */
export default {
    // 打开数据库
    openDB(name) {
        return new Promise((resolve, reject) => {
            if (!name) reject('未传入参数name');
            void plus.sqlite.openDatabase({ // 如果数据库存在则打开，不存在则创建
                name, //数据库名称
                path: `_doc/${name}.db`, //数据库路径 
                success: function() { //打开数据库成功回调函数,回调函数无返回参数
                    resolve();
                },
                fail: function(e) { //打开数据库失败回调函数
                    reject(e);
                }
            });
        });
    },

    // 判断数据库是否打开
    isOpenDatabase(name) {
        if (!name) return '未传入参数name';
        return plus.sqlite.isOpenDatabase({ //数据库已经打开则返回true，数据库没有打开则返回false。
            name, //数据库名称
            path: `_doc/${name}.db`, //数据库路径
        })
    },

    // 关闭数据库
    closeDB(name) {
        return new Promise((resolve, reject) => {
            if (!name) reject('未传入参数name');
            void plus.sqlite.closeDatabase({ //完成数据库操作后，必须关闭数据库，否则可能会导致系统资源无法释放。
                name, //数据库名称
                success: function() { //关闭数据库成功回调函数, 回调函数无返回参数。
                    resolve();
                },
                fail: function(e) { //关闭数据库失败回调函数
                    reject(e);
                }
            });
        });
    },

    // 执行事务
    transactionDB(name, operation) {
        return new Promise((resolve, reject) => {
            if (!name) reject('未传入参数name');
            if (!operation) reject('未传入参数operation');
            if (operation !== 'begin' && operation !== 'commit' && operation !== 'rollback')
                reject('operation可选值：begin（开始事务）、commit（提交）、rollback（回滚）');
            void plus.sqlite.transaction({
                name, //数据库名称
                operation, //需要执行的事务操作 可选值：begin（开始事务）、commit（提交）、rollback（回滚）
                success: function() { //执行事务成功回调函数, 回调函数无返回参数。
                    resolve();
                },
                fail: function(e) { //执行事务失败回调函数
                    reject(e);
                }
            });
        });
    },

    // 执行sql之前如果没有打开数据库，则打开
    beforeSql(func, name, ...args) {
        return new Promise((resolve, reject) => {
            this.openDB(name).then(res => {
                resolve(func.call(this, name, ...args))
            }).catch((err) => {
                reject(err)
            });
        });
    },

    // 执行SQL语句
    execute(name, sql) {
        if (!this.isOpenDatabase(name)) { //如果没有打开数据库，就先打开，再重新调用
            return this.beforeSql(this.execute, ...arguments)
        }
        return new Promise((resolve, reject) => {
            void plus.sqlite.executeSql({ //执行增删改等操作的SQL语句
                name, //数据库名称
                sql, //需要执行的SQL语句
                /* 参数为字符串时，表示执行单条SQL语句； 参数为字符串数组时，表示执行多条SQL语句，按数组顺序执行，某条SQL语句执行错误则终止。
                注意：Android平台不支持SQL语句中使用“;”分割多条命令，要运行多条命令请使用字符串数组参数。*/
                success: function(e) { //执行SQL语句成功回调函数, 回调函数无返回参数
                    resolve(e)
                },
                fail: function(e) { //执行SQL语句失败回调函数
                    reject(e);
                },
            });
        });
    },

    // 查询SQL语句
    select(name, sql) {
        if (!this.isOpenDatabase(name)) { //如果没有打开数据库，就先打开，再重新调用
            return this.beforeSql(this.select, ...arguments)
        }
        return new Promise((resolve, reject) => {
            void plus.sqlite.selectSql({ //执行查询的SQL语句
                name, //数据库名称
                sql, //需要查询的SQL语句
                success: function(data) { //执行SQL语句成功回调函数
                    //回调函数返回参数为JSON对象数组，其中JSON对象为查询的结果。 如果未查询到数据则返回参数为空数组。
                    resolve(data);
                },
                fail: function(e) { //执行SQL语句失败回调函数
                    reject(e);
                }
            });
        });
    },
};
